A client is any entity which receives data supplied by a server. Clients of a data server may include, for example, a process on the same node as the data server, a process on a different node than the data server, or a thread within a process. In a multi-process client/server computer system, a data server usually supplies data to multiple clients. The maximum rate at which a data server can supply data is known as the bandwidth of the server. The bandwidth of a server is divided among the clients of the data server.
Based on the functions performed by clients, clients of data servers can be classified as either real-time or non-real-time. Real time clients require data at set times and at a relatively constant rate. Data that arrives late typically is useless to real-time clients and can cause problems. For example, data for movie frames from a video server that arrives too late to be shown cannot be used and causes a visible momentary interruption of the movie. Timing is not so critical to non-real-time clients. Non-real-time clients do not require data at set times and may use data at varying rates.
Various approaches can be employed to allocate the bandwidth of a data server among clients of the data server. Operating systems typically use a preemptive approach to allocate bandwidth to clients. The preemptive approach emphasizes maximizing overall system throughput rather than providing a constant bandwidth to individual clients. Serving data requested by one client can be accomplished more efficiently by preempting the requests for data by other clients. The preemption can occur regardless of whether the preempted requests originated from real-time clients. Thus, real-time clients can incur undesirable interruptions and inconsistency in the rate at which they are allowed to access data in preemptive systems.
Another approach, the bandwidth allocation approach, avoids these undesirable interruptions. Under the bandwidth allocation approach, a portion of the total bandwidth of the server is assigned to each client.
While the bandwidth allocation approach assures availability of bandwidth for real-time clients, the approach wastes available bandwidth. Typically, clients, especially non-real-time clients, do not fully use the portion of the bandwidth assigned to them. Furthermore, the portion assigned to one client remains unavailable to other clients even when the one client is not fully using its portion of the bandwidth.
To illustrate these drawbacks, assume that ten real-time clients and five non-real-time clients each require 2 mb/sec of data from a video server that can supply 30 mb/sec of bandwidth. The aggregate rate assigned to all of the clients is 30 mb/sec. When 3 non-real-time clients and 1 real-time client do not use their assigned portion for a period of time, an 8 mb/sec portion of the bandwidth is left unused. When, during the same period of time, one non-real-time client could temporarily use 15 mb/sec, the non-real-time client's actual use is limited to 2 mb/sec despite the presence of the unused portion of the bandwidth. The unused portion of bandwidth is wasted because the non-real-time client can not exceed its assigned portion.
Based on the foregoing it is clearly desirable to provide a method of allocating bandwidth which allows resources unused by one client to be used by another client when a demand exists for those resources. It is also clearly desirable to provide a method of allocating bandwidth that ensures a constant bandwidth to real-time clients while meeting the varying bandwidth needs of non-real-time clients.